package com.jpro.framework.quartz.client.vo;

import com.jpro.framework.quartz.client.constant.MisfireStrategyEnum;
import com.jpro.framework.quartz.client.constant.ScheduleTypeEnum;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.ObjectUtils;

import java.util.Date;

/**
 * xxl-job info
 */
@Data
@NoArgsConstructor
public class XxlJobInfo {
    /**
     * 主键ID
     */
    private Integer id;
    /**
     * 执行器主键ID
     */
    private Integer jobGroup;
    /**
     * 任务执行CRON表达式
     */
    private String scheduleConf;
    private String jobDesc;

    private Date addTime;
    private Date updateTime;
    /**
     * 负责人
     */
    private String author;
    /**
     * 报警邮件
     */
    private String alarmEmail;
    /**
     * 执行器路由策略
     */
    private String executorRouteStrategy;
    /**
     * 执行器，任务Handler名称
     */
    private String executorHandler;
    /**
     * 执行器，任务参数
     */
    private String executorParam;
    /**
     * 阻塞处理策略
     * SERIAL_EXECUTION 单机串行
     * COVER_EARLY 覆盖之前的调度
     * DISCARD_LATER 丢弃后续调度
     */
    private String executorBlockStrategy;
    /**
     * 任务执行超时时间，单位秒
     */
    private Integer executorTimeout;
    /**
     * 失败重试次数
     */
    private Integer executorFailRetryCount;
    /**
     * GLUE类型	#com.xxl.job.core.glue.GlueTypeEnum
     */
    private String glueType;
    /**
     * GLUE源代码
     */
    private String glueSource;
    /**
     * GLUE备注
     */
    private String glueRemark;
    /**
     * GLUE更新时间
     */
    private Date glueUpdatetime;
    /**
     * 子任务ID，多个逗号分隔
     */
    private String childJobId;
    /**
     * 调度状态：0-停止，1-运行
     */
    private Integer triggerStatus;
    /**
     * 上次调度时间
     */
    private Long triggerLastTime;
    /**
     * 下次调度时间
     */
    private Long triggerNextTime;

    private String scheduleType;
    private String misfireStrategy;


    /**
     * 初始化参数
     * executorBlockStrategy
     * - 阻塞处理策略
     * SERIAL_EXECUTION 单机串行
     * COVER_EARLY 覆盖之前的调度
     * DISCARD_LATER 丢弃后续调度
     * executorRouteStrategy
     * - 路由策略：当执行器集群部署时，提供丰富的路由策略，包括；
     * FIRST（第一个）：固定选择第一个机器；
     * LAST（最后一个）：固定选择最后一个机器；
     * ROUND（轮询）：；
     * RANDOM（随机）：随机选择在线的机器；
     * CONSISTENT_HASH（一致性HASH）：每个任务按照Hash算法固定选择某一台机器，且所有任务均匀散列在不同机器上。
     * LEAST_FREQUENTLY_USED（最不经常使用）：使用频率最低的机器优先被选举；
     * LEAST_RECENTLY_USED（最近最久未使用）：最久未使用的机器优先被选举；
     * FAILOVER（故障转移）：按照顺序依次进行心跳检测，第一个心跳检测成功的机器选定为目标执行器并发起调度；
     * BUSYOVER（忙碌转移）：按照顺序依次进行空闲检测，第一个空闲检测成功的机器选定为目标执行器并发起调度；
     * SHARDING_BROADCAST(分片广播)：广播触发对应集群中所有机器执行一次任务，同时系统自动传递分片参数；可根据分片参数开发分片任务；
     *
     * @param info 传值
     */
    public XxlJobInfo(JobInfo info, Integer groupId) {
        this.id = info.getId();
        this.scheduleConf = info.getJobCron();
        this.executorHandler = info.getExecutorHandler();
        this.executorParam = info.getExecutorParam();
        this.author = !ObjectUtils.isEmpty(info.getAuthor()) ? info.getAuthor() : "system";
        this.jobGroup = groupId;
        this.jobDesc = !ObjectUtils.isEmpty(info.getJobDesc()) ? info.getJobDesc() : "定时任务";
        this.glueType = "BEAN";
        this.scheduleType = info.getScheduleType() == null ? ScheduleTypeEnum.CRON.name() : info.getScheduleType().name();
        this.misfireStrategy = MisfireStrategyEnum.DO_NOTHING.name();
        if (info.getExecutorBlockStrategyEnum() != null) {
            this.executorBlockStrategy = info.getExecutorBlockStrategyEnum();
        } else {
            this.executorBlockStrategy = "SERIAL_EXECUTION";
        }
        if (info.getExecutorRouteStrategyEnum() != null) {
            this.executorRouteStrategy = info.getExecutorRouteStrategyEnum();
        } else {
            this.executorRouteStrategy = "FIRST";
        }
        this.triggerStatus = info.getTriggerStatus() == null ? 0 : info.getTriggerStatus();
        this.executorTimeout = 0;
        this.executorFailRetryCount = 0;
        this.glueRemark = "GLUE代码初始化";
    }
}
